home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / tiff / tif_vms.c < prev    next >
C/C++ Source or Header  |  1995-06-21  |  7KB  |  302 lines

  1. /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_vms.c,v 1.13 1994/09/17 23:22:37 sam Exp $ */
  2.  
  3. /*
  4.  * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994 Sam Leffler
  5.  * Copyright (c) 1991, 1992, 1993, 1994 Silicon Graphics, Inc.
  6.  *
  7.  * Permission to use, copy, modify, distribute, and sell this software and 
  8.  * its documentation for any purpose is hereby granted without fee, provided
  9.  * that (i) the above copyright notices and this permission notice appear in
  10.  * all copies of the software and related documentation, and (ii) the names of
  11.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  12.  * publicity relating to the software without the specific, prior written
  13.  * permission of Sam Leffler and Silicon Graphics.
  14.  * 
  15.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  16.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  17.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  18.  * 
  19.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  20.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  21.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  22.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  23.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  24.  * OF THIS SOFTWARE.
  25.  */
  26.  
  27. /*
  28.  * TIFF Library VMS-specific Routines.
  29.  */
  30.  
  31. #include <stdlib>
  32. #include <unixio>
  33. #include <rms>
  34. #include <starlet>
  35. #include "tiffiop.h"
  36.  
  37. static tsize_t
  38. _tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size)
  39. {
  40.     return (read((int) fd, buf, size));
  41. }
  42.  
  43. static tsize_t
  44. _tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size)
  45. {
  46.     return (write((int) fd, buf, size));
  47. }
  48.  
  49. static toff_t
  50. _tiffSeekProc(thandle_t fd, toff_t off, int whence)
  51. {
  52.     return ((toff_t) lseek((int) fd, (off_t) off, whence));
  53. }
  54.  
  55. static int
  56. _tiffCloseProc(thandle_t fd)
  57. {
  58.     return (close((int) fd));
  59. }
  60.  
  61. #include <sys/stat.h>
  62.  
  63. static toff_t
  64. _tiffSizeProc(thandle_t fd)
  65. {
  66.     struct stat sb;
  67.     return (toff_t) (fstat((int) fd, &sb) < 0 ? 0 : sb.st_size);
  68. }
  69.  
  70. #ifdef MMAP_SUPPORT
  71. #include <fab.h>
  72. #include <secdef.h>
  73.  
  74. /*
  75.  * Table for storing information on current open sections. 
  76.  * (Should really be a linked list)
  77.  */
  78. #define MAX_MAPPED 100
  79. static int no_mapped = 0;
  80. static struct {
  81.     char *base;
  82.     char *top;
  83.     unsigned short channel;
  84. } map_table[MAX_MAPPED];
  85.  
  86. /* 
  87.  * This routine maps a file into a private section. Note that this 
  88.  * method of accessing a file is by far the fastest under VMS.
  89.  * The routine may fail (i.e. return 0) for several reasons, for
  90.  * example:
  91.  * - There is no more room for storing the info on sections.
  92.  * - The process is out of open file quota, channels, ...
  93.  * - fd does not describe an opened file.
  94.  * - The file is already opened for write access by this process
  95.  *   or another process
  96.  * - There is no free "hole" in virtual memory that fits the
  97.  *   size of the file
  98.  */
  99. static int
  100. _tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
  101. {
  102.     char name[256];
  103.     struct FAB fab;
  104.     unsigned short channel;
  105.     char *inadr[2], *retadr[2];
  106.     unsigned long status;
  107.     long size;
  108.     
  109.     if (no_mapped >= MAX_MAPPED)
  110.         return(0);
  111.     /*
  112.      * We cannot use a file descriptor, we
  113.      * must open the file once more.
  114.      */
  115.     if (getname((int)fd, name, 1) == NULL)
  116.         return(0);
  117.     /* prepare the FAB for a user file open */
  118.     fab = cc$rms_fab;
  119.     fab.fab$v_ufo = 1;
  120.     fab.fab$b_fac = FAB$M_GET;
  121.     fab.fab$b_shr = FAB$M_SHRGET;
  122.     fab.fab$l_fna = name;
  123.     fab.fab$b_fns = strlen(name);
  124.     status = sys$open(&fab);    /* open file & get channel number */
  125.     if ((status&1) == 0)
  126.         return(0);
  127.     channel = (unsigned short)fab.fab$l_stv;
  128.     inadr[0] = inadr[1] = (char *)0; /* just an address in P0 space */
  129.     /*
  130.      * Map the blocks of the file up to
  131.      * the EOF block into virtual memory.
  132.      */
  133.     size = _tiffSizeProc(fd);
  134.     status = sys$crmpsc(inadr, retadr, 0, SEC$M_EXPREG, 0,0,0, channel,
  135.         howmany(size,512), 0,0,0);
  136.     if ((status&1) == 0){
  137.         sys$dassgn(channel);
  138.         return(0);
  139.     }
  140.     *pbase = (tdata_t) retadr[0];    /* starting virtual address */
  141.     /*
  142.      * Use the size of the file up to the
  143.      * EOF mark for UNIX compatibility.
  144.      */
  145.     *psize = (toff_t) size;
  146.     /* Record the section in the table */
  147.     map_table[no_mapped].base = retadr[0];
  148.     map_table[no_mapped].top = retadr[1];
  149.     map_table[no_mapped].channel = channel;
  150.     no_mapped++;
  151.  
  152.         return(1);
  153. }
  154.  
  155. /*
  156.  * This routine unmaps a section from the virtual address space of 
  157.  * the process, but only if the base was the one returned from a
  158.  * call to TIFFMapFileContents.
  159.  */
  160. static void
  161. _tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size)
  162. {
  163.     char *inadr[2];
  164.     int i, j;
  165.     
  166.     /* Find the section in the table */
  167.     for (i = 0;i < no_mapped; i++) {
  168.         if (map_table[i].base == (char *) base) {
  169.             /* Unmap the section */
  170.             inadr[0] = (char *) base;
  171.             inadr[1] = map_table[i].top;
  172.             sys$deltva(inadr, 0, 0);
  173.             sys$dassgn(map_table[i].channel);
  174.             /* Remove this section from the list */
  175.             for (j = i+1; j < no_mapped; j++)
  176.                 map_table[j-1] = map_table[j];
  177.             no_mapped--;
  178.             return;
  179.         }
  180.     }
  181. }
  182. #else /* !MMAP_SUPPORT */
  183. static int
  184. _tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
  185. {
  186.     return (0);
  187. }
  188.  
  189. static void
  190. _tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size)
  191. {
  192. }
  193. #endif /* !MMAP_SUPPORT */
  194.  
  195. /*
  196.  * Open a TIFF file descriptor for read/writing.
  197.  */
  198. TIFF*
  199. TIFFFdOpen(int fd, const char* name, const char* mode)
  200. {
  201.     TIFF* tif;
  202.  
  203.     tif = TIFFClientOpen(name, mode,
  204.         (thandle_t) fd,
  205.         _tiffReadProc, _tiffWriteProc, _tiffSeekProc, _tiffCloseProc,
  206.         _tiffSizeProc, _tiffMapProc, _tiffUnmapProc);
  207.     if (tif)
  208.         tif->tif_fd = fd;
  209.     return (tif);
  210. }
  211.  
  212. /*
  213.  * Open a TIFF file for read/writing.
  214.  */
  215. TIFF*
  216. TIFFOpen(const char* name, const char* mode)
  217. {
  218.     static const char module[] = "TIFFOpen";
  219.     int m, fd;
  220.  
  221.     m = _TIFFgetMode(mode, module);
  222.     if (m == -1)
  223.         return ((TIFF*)0);
  224.         if (m&O_TRUNC){
  225.                 /*
  226.          * There is a bug in open in VAXC. If you use
  227.          * open w/ m=O_RDWR|O_CREAT|O_TRUNC the
  228.          * wrong thing happens.  On the other hand
  229.          * creat does the right thing.
  230.                  */
  231.                 fd = creat((char *) /* bug in stdio.h */ name, 0666,
  232.             "alq = 128", "deq = 64", "mbc = 32",
  233.             "fop = tef", "ctx = stm");
  234.     } else if (m&O_RDWR) {
  235.         fd = open(name, m, 0666,
  236.             "deq = 64", "mbc = 32", "fop = tef", "ctx = stm");
  237.     } else
  238.         fd = open(name, m, 0666, "mbc = 32", "ctx = stm");
  239.     if (fd < 0) {
  240.         TIFFError(module, "%s: Cannot open", name);
  241.         return ((TIFF*)0);
  242.     }
  243.     return (TIFFFdOpen(fd, name, mode));
  244. }
  245.  
  246. void*
  247. _TIFFmalloc(size_t s)
  248. {
  249.     return (malloc(s));
  250. }
  251.  
  252. void
  253. _TIFFfree(void* p)
  254. {
  255.     free(p);
  256. }
  257.  
  258. void*
  259. _TIFFrealloc(void* p, size_t s)
  260. {
  261.     return (realloc(p, s));
  262. }
  263.  
  264. void
  265. _TIFFmemset(void* p, int v, size_t c)
  266. {
  267.     memset(p, v, c);
  268. }
  269.  
  270. void
  271. _TIFFmemcpy(void* d, const void* s, size_t c)
  272. {
  273.     memcpy(d, s, c);
  274. }
  275.  
  276. int
  277. _TIFFmemcmp(const void* p1, const void* p2, size_t c)
  278. {
  279.     return (memcmp(p1, p2, c));
  280. }
  281.  
  282. static void
  283. vmsWarningHandler(const char* module, const char* fmt, va_list ap)
  284. {
  285.     if (module != NULL)
  286.         fprintf(stderr, "%s: ", module);
  287.     fprintf(stderr, "Warning, ");
  288.     vfprintf(stderr, fmt, ap);
  289.     fprintf(stderr, ".\n");
  290. }
  291. TIFFErrorHandler _TIFFwarningHandler = vmsWarningHandler;
  292.  
  293. static void
  294. vmsErrorHandler(const char* module, const char* fmt, va_list ap)
  295. {
  296.     if (module != NULL)
  297.         fprintf(stderr, "%s: ", module);
  298.     vfprintf(stderr, fmt, ap);
  299.     fprintf(stderr, ".\n");
  300. }
  301. TIFFErrorHandler _TIFFerrorHandler = vmsErrorHandler;
  302.